
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "air780ep_gnss_locator"
VERSION = "1.0.3"
-- 使用合宙iot平台时需要这个参数
PRODUCT_KEY = "NfBygF2dzKFyAnfcoO54B4jguIp6FkW0" -- 到 iot.openluat.com 创建项目,获取正确的项目id

--[[
本project需要mqtt库, 大部分能联网的设备都具有这个库
mqtt也是内置库, 无需require
]]

-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用mqtt库需要下列语句]]
_G.sysplus = require("sysplus")

--加载日志功能模块，并且设置日志输出等级
--如果关闭调用log模块接口输出的日志，等级设置为log.LOG_SILENT即可
log.setLevel("INFO")

------------SIM选择顺序配置-------------
mobile.simid(2, true)                                   -- 自动识别SIM0, SIM1, 且SIM0优先



--- CONFIGRATION  MARCO -----------
NETWORK_WAIT_MAX_TIME = (60*1000)                       -- 网络配置最长等待是回见
MQTT_CMD_WAIT_TIME = (20*60*1000)                       -- 控制命令等待时长，周期上报时间

MODBUS_EVALVE_ACTION_TIME = (50*1000)                     -- 阀门最长工作时间，超时关电降功耗


PUBLISH_MAX_TIMES = 100                                 -- 收到控制命令后重载reset_cnt，publish数据一次数据后reset_cnt--，直到0重启,控制周期上报时间


-----------------------------------------------------------------------------------------

MQTT_KEEP_ALIVE_TIMEOUT   = (8*60*1000)                   -- MQTT连接超时时长
MODBUS_EVALVE_QUERY_TIME  = (3*60*1000)                   -- 阀门轮询上电时间，超时关电降功耗


-------------------------------------------------------------------------------
MSG_REBOOT  = "reboot_system"                             -- 系统重启消息，publis此消息导致重启

-------------------------------KV data base------------------------------------
DB_K_QRUID       = "QRUID"
DB_V_QRUID_INIT  = "RWEVAL24xxxxxxxx"       -- RWEVAL24461BTB91

DB_K_MAX_VALVE_ID       = "VALVE_MAX_ID"
DB_V_MAX_VALVE_ID_INIT  = 2
DB_K_V1_OPEN_DEG        = "V1_OPEND_DEG"
DB_V_V1_OPEN_DEG_INIT   = 255
DB_K_V2_OPEN_DEG        = "V2_OPEND_DEG"
DB_V_V2_OPEN_DEG_INIT   = 255
DB_K_V3_OPEN_DEG        = "V3_OPEND_DEG"
DB_V_V3_OPEN_DEG_INIT   = 255
DB_K_V4_OPEN_DEG        = "V4_OPEND_DEG"
DB_V_V4_OPEN_DEG_INIT   = 255


----------------订阅reboot消息--------------------------
sys.subscribe("reboot_system", rtos.reboot)


----------------KV data base--------------------------

--[[
    kv数据库初始化task


]]
sys.taskInit(function()
    -- 初始化kv数据库
    local fs_rdy = fskv.init()
    if fs_rdy == true then  log.info("fskv", "kv database init complete") end
    -- 若KEY值不存在，set初始值 ----
    _G.QRUID = fskv.get(DB_K_QRUID)
    if _G.QRUID == nil or type(_G.QRUID) ~= "string" then
        _G.QRUID = DB_V_QRUID_INIT
        fskv.set(DB_K_QRUID, DB_V_QRUID_INIT)
        sys.publish(MSG_REBOOT)  --重启设备，使用新的QRUID
    end

    _G.MAX_VALVE_ID = fskv.get(DB_K_MAX_VALVE_ID)
    if _G.MAX_VALVE_ID == nil or type(_G.MAX_VALVE_ID) ~= "number" then
        -- _G.MAX_VALVE_ID = DB_V_MAX_VALVE_ID_INIT
        fskv.set(DB_K_MAX_VALVE_ID, DB_V_MAX_VALVE_ID_INIT)
    end

    _G.V1_OPEN_DEG = fskv.get(DB_K_V1_OPEN_DEG)
    if _G.V1_OPEN_DEG == nil or type(_G.V1_OPEN_DEG) ~= "number" then
        -- _G.V1_OPEN_DEG = DB_V_V1_OPEN_DEG_INIT
        fskv.set(DB_K_V1_OPEN_DEG, DB_V_V1_OPEN_DEG_INIT)
    end

    _G.V2_OPEN_DEG = fskv.get(DB_K_V2_OPEN_DEG)
    if _G.V2_OPEN_DEG == nil or type(_G.V2_OPEN_DEG) ~= "number" then
        -- _G.V2_OPEN_DEG = DB_V_V2_OPEN_DEG_INIT
        fskv.set(DB_K_V2_OPEN_DEG, DB_V_V2_OPEN_DEG_INIT)
    end

    _G.V3_OPEN_DEG = fskv.get(DB_K_V3_OPEN_DEG)
    if _G.V3_OPEN_DEG == nil or type(_G.V3_OPEN_DEG) ~= "number" then
        -- _G.V3_OPEN_DEG = DB_V_V3_OPEN_DEG_INIT
        fskv.set(DB_K_V3_OPEN_DEG, DB_V_V3_OPEN_DEG_INIT)
    end

    _G.V4_OPEN_DEG = fskv.get(DB_K_V4_OPEN_DEG)
    if _G.V4_OPEN_DEG == nil or type(_G.V4_OPEN_DEG) ~= "number" then
        -- _G.V4_OPEN_DEG = DB_V_V4_OPEN_DEG_INIT
        fskv.set(DB_K_V4_OPEN_DEG, DB_V_V4_OPEN_DEG_INIT)
    end

    ------------------------restore database-----------------------------

    _G.QRUID = fskv.get(DB_K_QRUID)
    _G.MAX_VALVE_ID = fskv.get(DB_K_MAX_VALVE_ID)
    _G.V1_OPEN_DEG  = fskv.get(DB_K_V1_OPEN_DEG)
    _G.V2_OPEN_DEG  = fskv.get(DB_K_V2_OPEN_DEG)
    _G.V3_OPEN_DEG  = fskv.get(DB_K_V3_OPEN_DEG)
    _G.V4_OPEN_DEG  = fskv.get(DB_K_V4_OPEN_DEG)

    log.info("fskv", "------------------------------DATABASE---------------------------------")
    log.info("fskv", DB_K_QRUID, type(_G.QRUID), _G.QRUID)
    log.info("fskv", DB_K_MAX_VALVE_ID, type(_G.MAX_VALVE_ID), _G.MAX_VALVE_ID)
    log.info("fskv", DB_K_V1_OPEN_DEG, type(_G.V1_OPEN_DEG), _G.V1_OPEN_DEG)
    log.info("fskv", DB_K_V2_OPEN_DEG, type(_G.V2_OPEN_DEG), _G.V2_OPEN_DEG)
    log.info("fskv", DB_K_V3_OPEN_DEG, type(_G.V3_OPEN_DEG), _G.V3_OPEN_DEG)
    log.info("fskv", DB_K_V4_OPEN_DEG, type(_G.V4_OPEN_DEG), _G.V4_OPEN_DEG)
    log.info("fskv", "------------------------------DATABASE---------------------------------")

end)




--[[
    软件看门狗
    用于检测用户是否操作，用户 MQTT_CMD_WAIT_TIME*3 mS没有操作阀门，则自动重启

]]
_G.socketsoftdog = sys.taskInit(function ()                                 -- 创建软件看门狗协程，tlink 协程喂狗
    while true do
        -- log.warn("mainWDT", "main watch dog feeded!")
        if sys.wait(MQTT_CMD_WAIT_TIME*3) == nil then                       --等待1个小时，没有操作阀门，重启防止栈溢出
            if Module_EVALVEBUS.is_valve_operating == false then
                log.warn("mainWDT", "main watch time out to reboot")
                rtos.reboot()                                               --阀门长时间未操作，softWDT 重启设备！！！！！！！！！！！
            end
        end
    end
end)



----------user defined modules--------
_G.Module_FOTA = require("Module_FOTA")
_G.Module_GETDATA = require("Module_GETDATA")
_G.Module_MQTT = require("Module_MQTT")
_G.Module_EVALVEBUS = require("Module_EVALVEBUS")






-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

